package com.powerbank.device.service;

import com.powerbank.device.dto.DeviceCommandDTO;
import com.powerbank.device.dto.DeviceStatusDTO;
import com.powerbank.device.dto.SlotStatusDTO;

/**
 * 增强版设备通信服务接口
 */
public interface EnhancedDeviceCommunicationService {

    /**
     * 发送开锁指令（通过MQTT）
     *
     * @param deviceCode 设备编码
     * @param slotNo     插槽号
     * @return 指令ID
     */
    String sendUnlockCommand(String deviceCode, Integer slotNo);

    /**
     * 发送锁定指令（通过MQTT）
     *
     * @param deviceCode 设备编码
     * @param slotNo     插槽号
     * @return 指令ID
     */
    String sendLockCommand(String deviceCode, Integer slotNo);

    /**
     * 查询设备状态（通过MQTT）
     *
     * @param deviceCode 设备编码
     * @return 指令ID
     */
    String queryDeviceStatus(String deviceCode);

    /**
     * 查询插槽状态（通过MQTT）
     *
     * @param deviceCode 设备编码
     * @param slotNo     插槽号
     * @return 指令ID
     */
    String querySlotStatus(String deviceCode, Integer slotNo);

    /**
     * 批量查询设备状态
     *
     * @param deviceCodes 设备编码列表
     * @return 发送成功的数量
     */
    int batchQueryDeviceStatus(String[] deviceCodes);

    /**
     * 检查指令执行结果
     *
     * @param commandId 指令ID
     * @return 执行结果
     */
    String getCommandResult(String commandId);

    /**
     * 等待指令执行完成
     *
     * @param commandId 指令ID
     * @param timeout   超时时间（秒）
     * @return 是否成功
     */
    boolean waitForCommandCompletion(String commandId, int timeout);

    /**
     * 取消指令
     *
     * @param commandId 指令ID
     * @return 是否成功
     */
    boolean cancelCommand(String commandId);

    /**
     * 获取设备实时状态（从缓存）
     *
     * @param deviceCode 设备编码
     * @return 设备状态
     */
    DeviceStatusDTO getCachedDeviceStatus(String deviceCode);

    /**
     * 获取插槽实时状态（从缓存）
     *
     * @param deviceCode 设备编码
     * @param slotNo     插槽号
     * @return 插槽状态
     */
    SlotStatusDTO getCachedSlotStatus(String deviceCode, Integer slotNo);
}